package org.wzh.spring.aop.demo2;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

/**
 * Audience类使用@AspectJ注解进行了标注.该注解表明Audience不仅仅是一个POJO,还是一个切面.
 * Audience类中的方法都是使用注解来定义切面的具体行为.
 * @author Pear
 * 相同的切点表达式重复了四遍,我们可以只定义相同的切点一次,然后每次需要的时候引用它.
 */
@Aspect
public class Audience {
	
	//表演之前
	@Before("execution(** org.wzh.spring.aop.demo2.Performance.perform(..))")
	public void silenceCellPhones() {
		System.out.println("Silencing cell phones --  Audience");
	}
	
	//表演之前
	@Before("execution(** org.wzh.spring.aop.demo2.Performance.perform(..))")
	public void takeSeats() {
		System.out.println("Taking seats --  Audience");
	}
	
	//表演之后
	@AfterReturning("execution(** org.wzh.spring.aop.demo2.Performance.perform(..))")
	public void applause() {
		System.out.println("CLAP CLAP CLAP!!! --  Audience");
	}
	
	//表演失败之后
	@AfterThrowing("execution(** org.wzh.spring.aop.demo2.Performance.perform(..))")
	public void demandRefund() {
		System.out.println("Demanding a refund --  Audience");
	}

}
